#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "ExtremeC_examples_chapter8_4_animal_p.h"

// 在父类层级上，animal_sound 的默认定义
void __animal_sound(void *this_ptr)
{
    animal_t *animal = (animal_t *)this_ptr;
    printf("%s: Beeeep\n", animal->name);
}

// 内存分配函数
animal_t *animal_new()
{
    return (animal_t *)malloc(sizeof(animal_t));
}

// 构造函数
void animal_ctor(animal_t *animal)
{
    animal->name = (char *)malloc(10 * sizeof(char));
    strcpy(animal->name, "Animal");
    // 将函数指针设置为指向默认的定义
    animal->sound_func = __animal_sound;
}

// 析构函数
void animal_dtor(animal_t *animal)
{
    free(animal->name);
}

// 行为函数
void animal_get_name(animal_t *animal, char *buffer)
{
    strcpy(buffer, animal->name);
}

void animal_sound(animal_t *animal)
{
    // 调用函数指针所指向的函数
    animal->sound_func(animal);
}